package servlets;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import util.MonTimerTask;
import util.TimerAttenteJoueur;
import be.ipl.finito.domaine.Joueur;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.usecases.GestionPartie;

@SuppressWarnings("serial")
@WebServlet(name = "servlet_attente_rejoindre_partie.html")
public class AttenteRejoindrePartie extends HttpServlet {
	@EJB GestionPartie gestionPartie;

	private static Map<Integer, TimerAttenteJoueur> timers = new HashMap<Integer, TimerAttenteJoueur>();
	private static Map<Integer, List<Joueur>> joueursAttente = new HashMap<Integer, List<Joueur>>();

	
	protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
		Joueur joueur = (Joueur) request.getSession().getAttribute("joueur");
		if (joueur == null) {
			RequestDispatcher rd = getServletContext().getNamedDispatcher("index.html");
			rd.forward(request, response);
			return;
		}
		if (request.getSession().getAttribute("partie") == null) {
			RequestDispatcher rd = getServletContext().getNamedDispatcher("servlet_dashboard.html");
			rd.forward(request, response);
			return;
		}
		int idPartie = (int) request.getSession().getAttribute("partie");

		// R��cup��re des donn��es du mod��le
		Partie partie = gestionPartie.getPartie(idPartie);
		
		if (partie != null) {
			List<String> joueurs = new LinkedList<String>();
			for (Joueur j : partie.getJoueurs()) {
				joueurs.add(j.getLogin());
			}
			request.setAttribute("joueurs", joueurs);
			final Integer nbJoueurs = new Integer(joueurs.size());
			
			if(!joueursAttente.containsKey(idPartie)){
				joueursAttente.put(idPartie, new ArrayList<Joueur>());
				joueursAttente.get(idPartie).add(joueur);
			}else{
				if(!joueursAttente.get(idPartie).contains(joueurs)){
					joueursAttente.get(idPartie).add(joueur);
				}
			}
			if (!timers.containsKey(idPartie)) {
				TimerAttenteJoueur timer = new TimerAttenteJoueur(idPartie);
				final MonTimerTask timerTask = new MonTimerTask(idPartie) {
					@Override
					public void run() {
						int a = nbJoueurs;
						int b = Partie.MIN_JOUEURS;
						if (nbJoueurs == gestionPartie.getJoueursDunePartie(this.getIdPartie()).size() && gestionPartie.getJoueursDunePartie(this.getIdPartie()).equals(joueursAttente.get(this.getIdPartie()))){
							gestionPartie.commencerPartie(this.getIdPartie());
							response.setStatus(290);
						}else {
							gestionPartie.abandonnerPartie(this.getIdPartie(),(String)request.getSession().getAttribute("joueur"));
							response.setStatus(291);
						}
						timers.remove(this.getIdPartie());
						joueursAttente.remove(this.getIdPartie());
					}
				};
				timer.schedule(timerTask, Partie.TEMPS_DEBUT_PARTIE * 1000);
				timers.put(idPartie, timer);
			}
			request.setAttribute("timer", Partie.TEMPS_DEBUT_PARTIE - timers.get(partie.getIdPartie()).tempsEcoule());
			if (gestionPartie.getJoueursDunePartie(idPartie).equals(joueursAttente.get(idPartie))){ // si tout les joueurs ont repris la partie
				timers.get(partie.getIdPartie()).cancel();
				gestionPartie.commencerPartie(partie.getIdPartie());
				response.setStatus(290);
			}
			// Rediriger
			request.setAttribute("servletDestination", "servlet_partie.html");
			RequestDispatcher rd = getServletContext().getNamedDispatcher("attentePartie.html");
			rd.forward(request, response);
			return;
		}

		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
